﻿package fr.babos.graphic.medias 
{
	import com.greensock.TweenLite;
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class ImageLoader extends Sprite
	{
		public static const RESIZE_INSIDE		:String 		= "inside";
		public static const RESIZE_OUTSIDE		:String 		= "outside";
		public static const RESIZE_STRETCH		:String 		= "stretch";
		
		/**
		 * Les dimensions
		 */
		protected var _width					:int;
		protected var _height					:int;
		
		/**
		 * Le loader
		 */
		protected var _loader					:Loader;
		
		/**
		 * Le type de redimentionnement
		 */
		protected var _resizeType				:String					= "inside";
		
		/**
		 * Si on doit lisser l'image
		 */
		protected var _smooth					:Boolean				= true;
		
		/**
		 * Si on doit faire une animation à la fin du chargement
		 */
		protected var _tweenOnComplete			:Boolean				= true;
		
		
		// Les getters
		public function get resizeType ():String
		{
			return _resizeType;
		}
		public function get smooth ():Boolean
		{
			return _smooth;
		}
		
		
		// Les setters
		public function set resizeType (value:String):void 
		{
			_resizeType = value;
		}
		public function set smooth (value:Boolean):void 
		{
			_smooth = value;
		}
		
		/**
		 * Animation sur la fin
		 */
		public function get tweenOnComplete ():Boolean 
		{
			return _tweenOnComplete;
		}
		
		public function set tweenOnComplete (value:Boolean):void 
		{
			_tweenOnComplete = value;
		}
		
		
		// Le constructeur
		public function ImageLoader (width:int = 50, height:int = 50, url:String = null, pResizeType:String = "")
		{
			if (pResizeType != "")
				_resizeType = pResizeType;
			
			// Enregistrer les dimentions
			_width = width;
			_height = height;
			
			// Si une URL est passée en paramètre, alors charger l'image
			if (url != null)
				load(url);
		}
		
		// La méthode pour charger le visuel
		public function load (url:String):void
		{
			trace("LOAD IMAGE", url);
			// Vérifier que l'url ne soit pas nulle
			if (url != null)
			{
				// Créer le loader
				_loader = new Loader()
				
				// Ajouter les écouteur
				_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
				_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadErrorHandler);
				
				// Et charger
				_loader.load(new URLRequest(url));
			}
		}
		
		// Chargement réussi
		protected function loadCompleteHandler (e:Event):void
		{
			// Redimentionner cette image
			if (_resizeType == "inside")
			{
				// Redimentionner avec des bordures
				if (_loader.width > _width)
				{
					_loader.width = _width;
					_loader.scaleY = _loader.scaleX;
				}
				if (_loader.height > _height)
				{
					_loader.height = _height;
					_loader.scaleX = _loader.scaleY;
				}
			}
			else if (_resizeType == "outside")
			{
				// Redimentionner sans bordures
				if (_loader.width < _width)
				{
					_loader.width = _width;
					_loader.scaleY = _loader.scaleX;
				}
				if (_loader.height < _height)
				{
					_loader.height = _height;
					_loader.scaleX = _loader.scaleY;
				}
			}
			else if (_resizeType == "stretch")
			{
				// Coller directement
				_loader.width = _width;
				_loader.height = _height;
			}
			
			// Centrer l'image
			if (_resizeType == "inside" || _resizeType == "outside" || _resizeType == "center")
			{
				_loader.x = _width / 2 - _loader.width / 2;
				_loader.y = _height / 2 - _loader.height / 2;
			}
			
			// Vérifier si on doit lisser ce bitmap
			Bitmap(_loader.content).smoothing = _smooth;
			
			// Ajouter cette image
			addChildAt(_loader, 0);
			
			// Faire la tween
			if (_tweenOnComplete)
			{
				// Faire l'animation
				TweenLite.from(_loader, .4, {
					alpha: 0
				});
			}
			
			// Dispatcher l'event
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		// Erreur de chargement
		protected function loadErrorHandler (e:IOErrorEvent):void
		{
			trace("IMAGE LOAD ERROR");
			if (this.hasEventListener(IOErrorEvent.IO_ERROR))
				dispatchEvent(e);
		}
	}
}